esbuild deno loaderをweb browserで動かす
esbuild_deno_loaderはweb browserだと動かせない動いた!
作業ログ
依存コードにDenoを使うコードが含まれてしまっているっぽい
Deno.*をmockで提供すれば動かせないか?
Deno.build.osにアクセスされている
https://docs.deno.com/api/deno/~/Deno.build
Deno.errors.AlreadyExists
deno_std/fsのcopyかmoveが走っている
2024-07-15 13:44:36 minifyなしで調べたほうが早い
はーん。副作用が混じってしまっているのか
13:50:24 うごいた
code:deno-mock.js
globalThis.Deno = {
build: { os: "linux" },
errors: { AlreadyExists: Error },
env: { get: () => undefined },
permissions: { query: () => Promise.resolve("denied") },
cwd: () => location.href,
};
/*@__PURE__*/で削れないかな?
code:mock入れて動くようになった.ts
import "./deno-mock.js"; // esbuild_deno_loaderより先に読み込む
目的のimportより前に読み込みたい副作用は、importを使う
https://esbuild.github.io/content-types/#real-esm-imports
code:mock入れて動くようになった.ts
import { initialize, build } from "../esbuild-wasm-no-blob/mod.ts";
import { denoResolverPlugin, denoLoaderPlugin } from "https://deno.land/x/esbuild_deno_loader@0.9.0/mod.ts";
try {
await initialize({
// 0.23.0
wasmModule: await WebAssembly.compileStreaming(
fetch("https://scrapbox.io/files/66b7068ffd3bc2001cedee03.wasm")
),
workerURL: "/api/code/takker-dist/esbuild-wasm-no-blob/worker.js",
});
} catch(_) {
// 重複初期化エラーは無視
}
const result = await build({
entryPoints: [
"https://scrapbox.io/api/code/nishio/nishio/script.js",
"https://scrapbox.io/api/code/takker/scrapbox-userscript-std/mod.ts",
// css is not supported
//"https://scrapbox.io/api/code/nishio/settings/style.css",
"https://scrapbox.io/api/code/shokai/shokai/script.js",
],
format: "esm",
minify: true,
bundle: true,
outdir: "out", // https://scrapbox.io/api/code が /out に置換される
charset: "utf8",
plugins: [
denoResolverPlugin(),
import graphを取得したかったが、resolved URLしかargから取得できなかった
importerが消えている
結果だけなら、Metafile.inputsから取得できるし、それでいいか。
code:mock入れて動くようになった.ts
{
name: "inspector",
setup(build) {
const onResolve = (args) => {
console.debug(args);
return undefined;
};
build.onResolve({ filter: /.*/, namespace: "file" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "http" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "https" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "data" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "npm" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "jsr" }, onResolve);
build.onResolve({ filter: /.*/, namespace: "node" }, onResolve);
},
},
denoLoaderPlugin({ loader: "portable" }),
],
write: false,
});
// 2つのファイルが配列される
console.debug(result.outputFiles);
なお、esbuild_deno_loaderはweb browserへ対応する予定がない
https://github.com/lucacasonato/esbuild_deno_loader/issues/50
#2024-08-14 08:48:27
#2024-07-30 09:56:01
#2024-07-16 11:27:20
#2024-07-15 16:09:10
#2024-06-24 11:16:35